package cn.zhfeat.framework.shiro.util;

import cn.zhfeat.core.shiro.ShiroSessionData;
import cn.zhfeat.utils.StringUtils;

import java.io.*;


/**
 * @author ZhangHao
 * @version 1.0.0.1
 * @description: 序列化与反序列化方法封装
 * @date 2018年5月15日 下午4:31:29
 */
public class ShiroSerializeUtil {


    /**
     * @param obj
     * @return
     * @throws Exception
     * @description: 序列化方法
     * @author ZhangHao
     * @date 2018年5月15日 下午4:34:23
     * @version 1.0.0.1
     */
    public static String serializeToString(Object obj) throws Exception {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream objOut = new ObjectOutputStream(byteOut);
        objOut.writeObject(obj);
        String str = byteOut.toString("ISO-8859-1");//此处只能是ISO-8859-1,但是不会影响中文使用
        return str;
    }

    /**
     * @param str
     * @return
     * @throws Exception
     * @description:反序列化方法
     * @author ZhangHao
     * @date 2018年5月15日 下午4:34:38
     * @version 1.0.0.1
     */
    public static Object deserializeToObject(String str) throws Exception {
        if (StringUtils.isEmpty(str)) {
            return null;
        }
        ByteArrayInputStream byteIn = new ByteArrayInputStream(str.getBytes("ISO-8859-1"));
        Object obj = null;
        try {
            ObjectInputStream objIn = new ObjectInputStream(byteIn);
            obj = objIn.readObject();
            return obj;

        } catch (EOFException e) {
            System.out.println("这是合法的，客户端已经关闭");
        }
        return obj;
    }

    /**
     * @param args
     * @throws Exception
     * @description: 测试方法
     * @author ZhangHao
     * @date 2018年5月15日 下午4:41:20
     * @version 1.0.0.1
     */
    public static void main(String[] args) throws Exception {
        ShiroSessionData ssd = new ShiroSessionData();
        ssd.setUserAccount("王老三");
        String serialStr = serializeToString(ssd);
        System.out.println(serialStr);
        ShiroSessionData ssd2 = (ShiroSessionData) deserializeToObject(serialStr);
        System.out.println(ssd2.getUserAccount());//输出王老三
    }

}
